import { ElMessage, ElNotification } from 'element-plus'

/**
 * 错误处理工具类
 */
class ErrorHandler {
  /**
   * 处理API错误
   * @param {Error} error 错误对象
   * @param {Object} options 配置选项
   */
  static handleApiError(error, options = {}) {
    const {
      showMessage = true,
      showNotification = false,
      fallbackMessage = '操作失败，请稍后重试'
    } = options

    let message = fallbackMessage
    let type = 'error'

    if (error.response) {
      // 服务器响应错误
      const { status, data } = error.response
      
      switch (status) {
        case 400:
          message = data.message || '请求参数错误'
          break
        case 401:
          message = '登录已过期，请重新登录'
          // 可以在这里处理登录跳转
          break
        case 403:
          message = '权限不足，无法执行此操作'
          break
        case 404:
          message = '请求的资源不存在'
          break
        case 429:
          message = '操作过于频繁，请稍后再试'
          type = 'warning'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = data.message || fallbackMessage
      }
    } else if (error.request) {
      // 网络错误
      message = '网络连接失败，请检查网络设置'
    }

    // 显示错误信息
    if (showMessage) {
      ElMessage({
        type,
        message,
        duration: 3000
      })
    }

    if (showNotification) {
      ElNotification({
        type,
        title: '错误提示',
        message,
        duration: 5000
      })
    }

    return { message, type }
  }

  /**
   * 处理购物车相关错误
   * @param {Error} error 错误对象
   */
  static handleCartError(error) {
    const errorMap = {
      '购物车商品数量不能超过100个': '购物车已满，请先结算部分商品',
      '操作过于频繁，请稍后再试': '操作太快了，请稍等片刻',
      '系统繁忙，请稍后重试': '系统繁忙，请稍后重试',
      '商品库存不足': '商品库存不足，请减少购买数量'
    }

    const originalMessage = error.response?.data?.message || error.message
    const friendlyMessage = errorMap[originalMessage] || originalMessage

    return this.handleApiError({
      ...error,
      response: {
        ...error.response,
        data: {
          ...error.response?.data,
          message: friendlyMessage
        }
      }
    })
  }

  /**
   * 处理支付相关错误
   * @param {Error} error 错误对象
   */
  static handlePaymentError(error) {
    const errorMap = {
      '订单不存在': '订单信息异常，请刷新后重试',
      '订单已支付': '订单已完成支付',
      '订单已超时': '订单已超时，请重新下单',
      '支付失败': '支付失败，请稍后重试或联系客服'
    }

    const originalMessage = error.response?.data?.message || error.message
    const friendlyMessage = errorMap[originalMessage] || originalMessage

    return this.handleApiError({
      ...error,
      response: {
        ...error.response,
        data: {
          ...error.response?.data,
          message: friendlyMessage
        }
      }
    }, {
      showNotification: true // 支付错误显示通知
    })
  }

  /**
   * 重试机制
   * @param {Function} fn 要重试的函数
   * @param {number} maxRetries 最大重试次数
   * @param {number} delay 重试延迟（毫秒）
   */
  static async retry(fn, maxRetries = 3, delay = 1000) {
    let lastError

    for (let i = 0; i <= maxRetries; i++) {
      try {
        return await fn()
      } catch (error) {
        lastError = error
        
        if (i === maxRetries) {
          break
        }

        // 指数退避
        const waitTime = delay * Math.pow(2, i)
        await new Promise(resolve => setTimeout(resolve, waitTime))
      }
    }

    throw lastError
  }

  /**
   * 处理并发请求错误
   * @param {Array} promises Promise数组
   * @param {Object} options 配置选项
   */
  static async handleConcurrentErrors(promises, options = {}) {
    const {
      failFast = false, // 是否快速失败
      showErrors = true // 是否显示错误
    } = options

    if (failFast) {
      // 任一失败则全部失败
      return Promise.all(promises)
    } else {
      // 部分成功也返回结果
      const results = await Promise.allSettled(promises)
      
      const errors = results
        .filter(result => result.status === 'rejected')
        .map(result => result.reason)

      if (errors.length > 0 && showErrors) {
        ElMessage.warning(`${errors.length}个操作失败`)
      }

      return results
    }
  }
}

export default ErrorHandler
